#ifndef FCCU_H
#define FCCU_H

#include <stdint.h>
#include <stdbool.h>
#include "qpc_stub.h"
#include "fccu_queue.h"

#define FCCU_MAX_FAULT_NUM      (64U)
#define FCCU_QUEUE_LEVELS       (4U)
#define FCCU_QUEUE_LEVEL_SIZE   (32U)

/* 故障队列项结构体 */
struct FCCU_VmEntry
{
    uint8_t  fault_index;      /* 故障索引 */
    uint8_t  reserved[7];      /* 填充到8字节对齐 */
    uint64_t fault_detail;     /* 故障详细信息 */
    uint32_t count;            /* 故障计数 */
    uint8_t  padding[12];      /* 填充到总共32字节 */
};

/* 故障注册表结构体 */
struct FCCU_FaultTableEntry
{
    uint32_t fault_code;       /* 故障码 */
    uint32_t attr;             /* 属性 */
    uint32_t err_threshold;    /* 错误阈值 */
    int32_t (*user_hook)(uint32_t, uint64_t, bool); /* 用户钩子，处理故障时回调 */
};

/* 事件对象结构体 */
struct FCCU_Event
{
    struct QEvt super;         /* 基类事件 */
    uint8_t priority;          /* 优先级 */
    uint8_t fault_index;       /* 故障索引 */
    uint64_t fault_detail;     /* 故障详细信息 */
};

/* FCCU初始化 */
void Fccu_Init(void);
/* 故障上报接口 */
int32_t Fccu_ReportFaultPoint(uint32_t fault_index, uint64_t fault_detail, uint8_t priority);
/* 故障后处理接口 */
void Fccu_ProcessPostEvent(struct QActive *ao, uint8_t ao_priority);

/**
 * @brief   主动清除某个故障状态（人工恢复/自愈）
 * @param   fault_index   故障索引号
 */
void Fccu_ClearFault(uint32_t fault_index);

/**
 * @brief   查询所有当前未恢复的故障
 * @retval  活跃故障数量
 */
uint16_t Fccu_GetActiveFaults(void);

/**
 * @brief   设置队列溢出回调函数
 * @param   callback   用户自定义溢出回调
 */
void Fccu_SetQueueOverflowCallback(void (*callback)(void));

/**
 * @brief   注册用户自定义故障处理钩子
 * @param   fault_index   故障索引号
 * @param   user_hook     用户钩子函数指针
 * @retval  0 成功，负数失败
 */
int32_t Fccu_RegisterUserHook(uint32_t fault_index, int32_t (*user_hook)(uint32_t, uint64_t, bool));

#endif /* FCCU_H */